//package com.demo.module.config.sharding;
//
//import com.google.common.collect.Maps;
//import com.google.common.collect.Sets;
//import org.apache.shardingsphere.driver.jdbc.core.datasource.ShardingSphereDataSource;
//import org.apache.shardingsphere.infra.datanode.DataNode;
//import org.apache.shardingsphere.sharding.rule.ShardingRule;
//import org.apache.shardingsphere.sharding.rule.TableRule;
//import org.springframework.boot.ApplicationArguments;
//import org.springframework.boot.ApplicationRunner;
//import org.springframework.stereotype.Component;
//
//import javax.annotation.Resource;
//import javax.sql.DataSource;
//import java.lang.reflect.Field;
//import java.lang.reflect.Modifier;
//import java.time.LocalDateTime;
//import java.time.format.DateTimeFormatter;
//import java.util.*;
//import java.util.concurrent.atomic.AtomicInteger;
//
//@Component
//public class AutoConfigShardingDateNodes implements ApplicationRunner {
//
//    @Resource
//    private DataSource dataSource;
//
//    @Override
//    public void run(ApplicationArguments args) throws Exception {
//        //sharding数据源
//        ShardingDataSource shardingDataSource = (ShardingDataSource)this.dataSource;
//        //所有的拆分表
//        ShardingRule rule = shardingDataSource.getRuntimeContext().getRule();
//        Collection<TableRule> tableRules = rule.getTableRules();
//        for (TableRule tableRule : tableRules) {
//            // 表的节点
//            List<DataNode> dataNodes = tableRule.getActualDataNodes();
//            // 动态刷新actualDataNodesField
//            Field actualDataNodesField = TableRule.class.getDeclaredField("actualDataNodes");
//            Field modifiersField = Field.class.getDeclaredField("modifiers");
//            modifiersField.setAccessible(true);
//            // 设置修饰符：private
//            modifiersField.setInt(actualDataNodesField, actualDataNodesField.getModifiers() & ~Modifier.FINAL);
//            // 我这里就两个写死的表，这里可以获取now
//            // 下面循环次数可以控制当前的项目可以访问的表格（只可以看几天内的数据）
//            LocalDateTime localDateTime = LocalDateTime.now();
//            // 新节点
//            List<DataNode> newDataNodes = new ArrayList<>();
//            // 数据源
//            String dataSourceName = dataNodes.get(0).getDataSourceName();
//            // 逻辑表名
//            String logicTableName = tableRule.getLogicTable();
//            StringBuilder stringBuilder = new StringBuilder().append(dataSourceName).append(".").append(logicTableName);
//            int length = stringBuilder.length();
//            // 循环动态拼接所有节点表名
//            for (int i = 0; i < 2; i++) {
//                stringBuilder.setLength(length);
//                stringBuilder.append(localDateTime.format(DateTimeFormatter.ofPattern("_yyyyMMdd")));
//                DataNode dataNode = new DataNode(stringBuilder.toString());
//                newDataNodes.add(dataNode);
//                localDateTime = localDateTime.minusDays(1);
//            }
//            actualDataNodesField.setAccessible(true);
//            // 数据更新回去
//            actualDataNodesField.set(tableRule, newDataNodes);
//            Set<String> actualTables = Sets.newHashSet();
//            Map<DataNode, Integer> dataNodeIntegerMap = Maps.newHashMap();
//
//            AtomicInteger a = new AtomicInteger(0);
//            newDataNodes.forEach((dataNode -> {
//                actualTables.add(dataNode.getTableName());
//                if (a.intValue() == 0) {
//                    a.incrementAndGet();
//                    dataNodeIntegerMap.put(dataNode, 0);
//                }
//                else {
//                    dataNodeIntegerMap.put(dataNode, a.intValue());
//                    a.incrementAndGet();
//                }
//            }));
//
//            // 动态刷新：actualTables
//            Field actualTablesField = TableRule.class.getDeclaredField("actualTables");
//            actualTablesField.setAccessible(true);
//            actualTablesField.set(tableRule, actualTables);
//
//            // 动态刷新：dataNodeIndexMap
//            Field dataNodeIndexMapField = TableRule.class.getDeclaredField("dataNodeIndexMap");
//            dataNodeIndexMapField.setAccessible(true);
//            dataNodeIndexMapField.set(tableRule, dataNodeIntegerMap);
//
//            // 动态刷新：datasourceToTablesMap
//            Map<String, Collection<String>> datasourceToTablesMap = Maps.newHashMap();
//            datasourceToTablesMap.put(dataSourceName, actualTables);
//            Field datasourceToTablesMapField = TableRule.class.getDeclaredField("datasourceToTablesMap");
//            datasourceToTablesMapField.setAccessible(true);
//            datasourceToTablesMapField.set(tableRule, datasourceToTablesMap);
//        }
//    }
//}
